package main

import "fmt"

func main() {

	// 获取变量的地址
	a := 10
	fmt.Println("变量的地址: %x\n", &a)

	// 声明指针变量
	var ip *int

	ip = &a
	/* 指针变量的存储地址 */
	fmt.Printf("ip 变量的存储地址: %x\n", ip)

	/* 使用指针访问值 */
	fmt.Printf("*ip 变量的值: %d\n", *ip)

	// 指针改变变量的值
	fmt.Println("address of b is", a)
	fmt.Println("value of ip is", *ip)
	*ip++
	fmt.Println("new value of a is", a)

	// 指针改变值
	fmt.Println("value of a before function call is", a)
	b := &a
	change(b)
	fmt.Println("value of a after function call is", a)

	// 不要将一个指向数组的指针传递给函数。使用切片
	arr := [3]int{10, 15, 19}
	modify(arr[:])
	fmt.Println(arr)

	/**
	 * 指针的指针
	 * 如果一个指针变量存放的又是另一个指针变量的地址，则称这个指针变量为指向指针的指针变量
	 */
	var e int
	var ptr *int
	var pptr **int

	ptr = &e
	pptr = &ptr

	/* 获取 pptr 的值 */
	fmt.Printf("变量 e = %d\n", e)
	fmt.Printf("指针变量 *ptr = %d\n", *ptr)
	fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)

}

func change(val *int) {
	*val = 55
}

func modify(sls []int) {
	sls[0] = 90
}
